//@author 		  Y. Laenen [C1011950]
//Last revision	  27-11-2013

package core.logic.dataAccess;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;


import core.logic.services.utilServices.ConnectionService;
import core.models.domainModel.Adres;
import core.models.domainModel.Luchthaven;
import core.models.domainModel.Passagier;
import core.models.domainModel.Persoon;
import core.models.domainModel.Vlucht;

public class BookingDAO {

//	VLUCHTENINFO
	public static ArrayList<Vlucht> getAllVluchten(Luchthaven v, Luchthaven a, String vd, String ad, String zitplaatsType){
		ArrayList<Vlucht> lijst = new ArrayList<Vlucht>();
		
		
		String queryEnd = null;
		Integer zoekType =null;
		
		if (ad == null && vd == null)
		{
			queryEnd = "WHERE Vl.AankomstLuchthavenId = ? AND Vl.VertrekLuchthavenId = ? ";
			zoekType=1;
		}
		else
		{
			if(vd == null)
			{
				queryEnd = "WHERE Vl.AankomstLuchthavenId = ? AND Vl.VertrekLuchthavenId = ? AND substring(Vl.AankomstTijd, 1,10) = ?;";
				zoekType=2;
			}
			else
			{
				if (ad == null)
				{
					queryEnd = "WHERE Vl.AankomstLuchthavenId = ? AND Vl.VertrekLuchthavenId = ? AND substring(Vl.VertrekTijd, 1, 10) = ?;";
					zoekType=3;
				}
				else
				{
					queryEnd = "WHERE Vl.AankomstLuchthavenId = ? AND Vl.VertrekLuchthavenId = ? AND substring(Vl.VertrekTijd, 1, 10) = ? AND substring(Vl.AankomstTijd, 1,10) = ?;";
					zoekType=4;
				}
			}
		}
		
		String sql = "USE LuchthavenDB " +
					"SELECT Vl.*, SQ1.Plaatsen AS AllePlaatsen, SQ2.Plaatsen AS BezettePlaatsen, (SQ1.Plaatsen - SQ2.Plaatsen) AS VrijePlaatsen " +
					"FROM Vlucht AS Vl LEFT OUTER JOIN (" +
					"SELECT Zi.VluchtId, COUNT(Zi.ZitplaatsId) AS Plaatsen " +
					"FROM Zitplaats AS Zi " +
					"WHERE Zi.ZitplaatsType= ? " +
					"GROUP BY Zi.VluchtId) AS SQ1 " +
					"ON Vl.VluchtId = SQ1.VluchtId " +
					"LEFT OUTER JOIN (" +
					"SELECT Pa.VluchtId, COUNT(*) AS Plaatsen " +
					"FROM Passagier AS Pa " +
					"GROUP BY Pa.VluchtId) AS SQ2 " +
					"ON Vl.VluchtId = SQ2.VluchtId " +
					queryEnd;
											
				
		try{
			
			PreparedStatement prep= ConnectionService.getConnection().prepareStatement(sql);
			
			switch (zoekType) {
			case 1:
				prep.setString(1, zitplaatsType);
				prep.setInt(2, a.getId());
				prep.setInt(3, v.getId());
				break;
				
			case 2:
				prep.setString(1, zitplaatsType);
				prep.setInt(2, a.getId());
				prep.setInt(3, v.getId());
				prep.setString(4, ad);
				break;
				
			case 3:
				prep.setString(1, zitplaatsType);
				prep.setInt(2, a.getId());
				prep.setInt(3, v.getId());
				prep.setString(4, vd);
				break;
				
			case 4:
				prep.setString(1, zitplaatsType);
				prep.setInt(2, a.getId());
				prep.setInt(3, v.getId());
				prep.setString(4, vd);
				prep.setString(5, ad);
				break;

			default:
				break;
			}
			
		
			
			ResultSet rs = prep.executeQuery();
			
			while(rs.next()){
				Vlucht vl = new Vlucht(
						rs.getInt("VluchtId"), 
						null, 
						a ,  
						rs.getString("aankomstTijd"), 
						v, 
						rs.getString("vertrekTijd"), 
						rs.getDouble("prijsBusiness"), 
						rs.getDouble("prijsEconomy"), 
						"", // Bertels Nick c1019387 (status : van INT naar STRING )
						rs.getString("VluchtNr"), 
						null, 
						null, 
						null);

				Integer alleZitplaatsen = rs.getInt("AllePlaatsen");
				Integer bezetteZitplaatsen = rs.getInt("BezettePlaatsen");
				if (alleZitplaatsen == null) {
					alleZitplaatsen = 0;
				}
				if (bezetteZitplaatsen == null) {
					bezetteZitplaatsen = 0;
				}
				
				vl.setVrijeZitplaatsen(alleZitplaatsen - bezetteZitplaatsen); //@author: Lieven Vandeperre -->probleem opgelost met vrije zitplaatsen (uit constructor gehaald). 
				lijst.add(vl);
			}
			
		}
		catch(SQLException ex){
			ex.printStackTrace();
		}
		
		return lijst;	 
	}
	

	//wegschrijven persoonsgegevens voor booking

	public static Passagier writePersGegevens(String straat, int huisnummer, String bus, String gemeente, String postcode, String prov, String land, String naam, 
										 String voornaam, String geboortedatum, String indentiteitskaartNr, Vlucht vlucht, String bookingtype)
	{
		//INSERT Adres dmv adresDAO
		Adres adres = new Adres(straat, huisnummer, bus, gemeente, postcode, prov, land);
		int result = AdresDAO.AddAdres(adres);
		int fkey = adres.get_adresId();
		adres.set_adresId(fkey);

		
		//INSERT Persoon dmv PersoonDAO en key van adres
		Persoon persoon = new Persoon();
		persoon.setNaam(naam);
		persoon.setVoornaam(voornaam);
		persoon.setAdres(adres);
		persoon.setGeboortedatum(geboortedatum);
		int key = PersoonDAO.AddPersoon(persoon);
		persoon.setPersoonId(key);
		
		//Insert passagier
		//Afspraak: bij het aanmaken van passagier genereren we, zonder in te vullen, al een zitplaatsId. Op deze basis tellen we het aantal vrije plaatsen
	
		Passagier passagier = new Passagier(persoon, vlucht, bookingtype, indentiteitskaartNr, null, null, 0, null, null);
		
		int resultpassa = PassagierDAO.AddPassagier(passagier);
		
		return passagier;
	}
	
	//wegschrijven van betalingsgegevens passagier
	public static int writeBetalingsGegevens(Passagier passagier ,String kaartnummer, String kaartType, int controleCijfer, String vervaldatum)
	{
			String sql = "UPDATE Passagier " +
						 "SET kaartType=?, kaartNummer=?, controleCijfer=?, VervalDag=? " +
						 "WHERE PassagierId = ?";
			int ok = 0;
		
			try{
				
				Connection con = ConnectionService.getConnection();
				PreparedStatement pst = con.prepareStatement(sql, Statement.SUCCESS_NO_INFO);
				pst.setString(1,kaartType);
				pst.setString(2, kaartnummer);
				pst.setInt(3, controleCijfer);
				pst.setString(4, vervaldatum);
				pst.setInt(5, passagier.getPassagierId());
				
				ok = pst.executeUpdate();
				
			}
			catch(SQLException ex){
				
			}
			return ok;
		}
		
		
}
